﻿using System;
using System.Globalization;
using System.Threading;
using System.Web;
using FranceTriple.Dal;
using TeamFranceTriple.Config;

namespace TeamFranceTriple
{
    /// <summary>
    /// Initialisation du theme et des culture et cultureui
    /// La variable ThisMaster n'est pas encore affectée à ces étapes du cycle de vie de la requete
    /// </summary>
    public class BasePage : System.Web.UI.Page
    {
        protected SiteMaster ThisMaster;
        private static String defaultCulture = TeamFranceTripleConfig.WebConfig.defaultculturewhenacceptcultureisnull.culture.ToLower();

        protected override void InitializeCulture()
        {
            String[] acceptLanguage;
            String userCulture;
            String appliedCulture;
            CultureInfo appliedCultureInfo = null;

            if (Request.RawUrl.ToLower().StartsWith("/default.aspx?page="))
                // Page inconnue ? Erreur 404 pour assurer la mise à jour des moteurs de recherche
                throw new HttpException(404, "BasePage().InitializeCulture : This page don't exists anymore: " + Request.RawUrl.ToLower());

            // Référence commune vers les propriétés publiques qui commencent par "Requester" pour "Request's User"            

            // ordre de priorité des cultures dans leur application
            // la premiere qui fonctionne est appliquée
            // 1) request http://www.teamfrancetriple.com/en-us/ http://www.teamfrancetriple.com/fr-fr/
            // 2) user    UserProfile.GetUserProfile().UserChoosenCulture
            // 3) header  Context.Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"]
            // 4) default TeamFranceTripleConfig.WebConfig.defaultculturewhenacceptcultureisnull.culture

            //Culture demandée par la requete
            if (Page.RouteData.Values["culture"] != null)
            {
                appliedCulture = Page.RouteData.Values["culture"].ToString().ToLower();
                try
                {
                    UICulture = appliedCulture;
                    Culture = appliedCulture;
                    appliedCultureInfo = CultureInfo.CreateSpecificCulture(appliedCulture);
                }
                catch (CultureNotFoundException)
                {
                    //Culture par défaut
                    //appliedCulture = defaultCulture;
                    //Response.Redirect("~/" + appliedCulture + "/");

                    // Page inconnue ? Erreur 404 pour assurer la mise à jour des moteurs de recherche
                    throw new HttpException(404, "This page don't exists anymore. (RequesterCulture): " + appliedCulture);
                }
                Thread.CurrentThread.CurrentCulture = appliedCultureInfo;
                Thread.CurrentThread.CurrentUICulture = appliedCultureInfo;

                //Solved: La référence à la MasterPage est Static, donc à faire après avoir appliqué les cultures
                ThisMaster = ((SiteMaster)this.Master);
                ThisMaster.RequesterCulture = appliedCulture.ToLower();
            }
            else
            {   //Culture du profile utilisateur
                userCulture = UserProfile.GetUserProfile().UserChoosenCulture;
                if ((Page.User.Identity.IsAuthenticated) && userCulture != String.Empty)
                {
                    appliedCulture = userCulture.ToLower();
                    Response.Redirect("~/" + appliedCulture + "/");
                }
                else
                {
                    //Culture des headers
                    if (Context.Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"] != null)
                    {
                        acceptLanguage = Context.Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"].Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                        // Try - pour le cas d'une culture personalisée qui n'existe pas dans .NET
                        try
                        {
                            appliedCultureInfo = CultureInfo.CreateSpecificCulture(acceptLanguage[0]);
                            appliedCulture = appliedCultureInfo.Name.ToLower();
                            Response.Redirect("~/" + appliedCulture + "/");
                        }
                        catch (CultureNotFoundException)
                        {
                            //Culture par défaut
                            //appliedCulture = defaultCulture;
                            //Response.Redirect("~/" + appliedCulture + "/");

                            // Page inconnue ? Erreur 404 pour assurer la mise à jour des moteurs de recherche
                            throw new HttpException(404, "This page don't exists anymore.(HeaderCulture): " + acceptLanguage);
                        }
                    }
                    else
                    {
                        //Culture par défaut
                        appliedCulture = defaultCulture;
                        Response.Redirect("~/" + appliedCulture + "/");
                    }
                }
            }
        }

        protected void Page_PreInit(object sender, EventArgs e)
        {
            var userTheme = UserProfile.GetUserProfile().UserTheme;
            // Pour les utilisateurs anonymes et les utilisateurs authentifiés sans profil, récupérer les langues du navigateur
            if (!(Session["AnonymousID"] == null) || userTheme == String.Empty)
            {
                Page.Theme = "default";
            }
            // Récupérer la culture de l'utilisateur authentifié dans son profil, si elle existe !
            else
            {
                Page.Theme = userTheme;
            }
        }
    }
}